package sqlx

// Select 使用提供的查询器查询多条数据，并将结果扫描进<pointer>中。参数<pointer>必须是切片(slice)类型。
//  如果<pointer>中的元素是可扫描的，则结果集必须只有一列。否则，将使用StructScan。
//  默认sql.Rows自动关闭。<querySql>是SQL查询语句。
func Select(q IQuery, pointer interface{}, querySql string, args ...interface{}) error {
	rows, err := q.QueryX(querySql, args...)
	if err != nil {
		return err
	}
	defer rows.Close()
	return scanAll(rows, pointer, false)
}

// Take (原Get) 使用提供的查询器，查询一条记录，并将结果扫描进<pointer>中。参数<pointer>可以是 struct/*struct。
//  如果<pointer>是可扫描的，则结果必须只有一列。否则，将使用StructScan。
//  如果结果集为空，将返回像row.Scan一样的sql.ErrNoRows。
func Take(q IQuery, pointer interface{}, querySql string, args ...interface{}) error {
	r := q.QueryRowX(querySql, args...)
	return r.scanAny(pointer, false) // 将 r中的结果通过 scanAny()扫描进dest.
}

// PrepareX 准备 stmt
func PrepareX(p IPrepare, query string) (*Stmt, error) {
	s, err := p.Prepare(query)
	if err != nil {
		return nil, err
	}
	return &Stmt{Stmt: s, unsafe: isUnsafe(p), Mapper: mapperFor(p)}, err
}